<?php
/**
 * <https://y.st./>
 * Copyright © 2016 Alex Yst <mailto:copyright@y.st>
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <https://www.gnu.org./licenses/>.
**/

$xhtml = array(
	'<{title}>' => "Blocking exit and non-exit $a[Tor] nodes",
	'<{body}>' => <<<END
<p>
	My modem keeps giving out on me, which is incredibly annoying.
	It&apos;s been doing this over the past few days.
	Worse though, it somehow brings my $a[Tor] node down with it.
	Once $a[Tor] goes down, I can bring it back up, but it won&apos;t stay up, at least not if I bring it up with its correct configuration.
	Instead, I have to remove my <a href="/en/domains/sbuk7aqcxkoyipwv.onion.xhtml">$a[IRC] proxy hidden service</a> from <a href="file:///etc/tor/torrc">torrc file</a>, start <a href="apt:tor">$a[Tor]</a>, add the hidden service back to torrc, and run <code>sudo killall -HUP tor</code> to make $a[Tor] read and use the proper configuration.
	It&apos;s driving me nuts.
	If $a[Tor] is able to use the configuration I want, why isn&apos;t it able to start up with that configuration?
</p>
<p>
	I haven&apos;t heard back from the Patreon people yet, so I decided to write another email, further explaining the problem:
</p>
<blockquote>
<p>
	Hello!
</p>
<p>
	I&apos;ve done more looking into this issue on my own.
	It seems to be due to the new obnoxious CAPTCHA frequency.
	It used to be that Patreon would force me to fill out a CAPTCHA every couple months or so.
	Now, Patreon requires a CAPTCHA every time that I visit the site.
	As a paying customer, this makes me very unhappy, but as the login issue was a bigger problem, I wrote about that first and was going to complain about the CAPTCHAs later.
	As it turns out though, your log in JavaScript is itself behind another CAPTCHA, one that can&apos;t be solved because it never gets seen.
</p>
<p>
	I hate to be rude, but this really does need to be fixed.
	It isn&apos;t polite to bombard your paying customers with CAPTCHAs every time that they visit your site.
	Please, PLEASE fix this.
</p>
<p>
	~ Yst Dawson
</p>
</blockquote>
<p>
	I hope that I didn&apos;t sound too rude, but their new policy of serving $a[CAPTCHA]s to $a[Tor] users is garbage.
</p>
<p>
	Speaking of $a[Tor] users, the Geocaching website now thinks that my mother is a $a[Tor] user and is preventing her from logging her finds.
	There&apos;s no reason for this.
	Sure, we have a $a[Tor] relay at the house, but it&apos;s a non-exit node.
	Anyone that is connecting to their site from her $a[IP] address isn&apos;t a $a[Tor] user.
	Being that my mother is extremely against privacy and proxies, she blamed me, not the website.
	She doesn&apos;t know about my $a[Tor] node though, she only knows that I use proxies, so I was quickly able to get her to stop blaming me by showing her that, from her own Web browser, her $a[IP] address shows up as being one located in our city and owned by our $a[ISP].
	Regardless, I don&apos;t need her looking into this any further, as she feels proxies, not those that block them, are the problem.
	Even if proxies were the problem, my node&apos;s not an exit, so blocking it doesn&apos;t block proxies; instead, it blocks people on the same network as a proxy.
	It&apos;s not an attack on anonymity, demanding that your users bow to you and tell you where they are.
	It&apos;s an attack on those that support anonymity, even if they are willing to give you, and only you, their $a[IP] address!
</p>
<blockquote>
<p>
	A while ago, I wrote to Geocaching about you blocking proxies being used to log finds.
	Although proxies are an important tool for fighting government surveillance, you took the pro-surveillance side and wouldn&apos;t fix the problem.
</p>
<p>
	However now, you&apos;re blocking my mother, Dragon&apos;s Passion 4 Caching, from logging from her home connection.
	She doesn&apos;t use a proxy.
	Her home IP address is 97.82.100.91.
	Can you please do something to unblock her?
</p>
</blockquote>
<p>
	When I wrote to them about the issue with them blocking proxies, they mentioned being able to whitelist $a[IP] addresses, and they were willing to do it for me.
	It didn&apos;t help me, as my $a[IP] address changes every ten minutes, but I&apos;m hoping that they&apos;ll do it for my mother.
	I dropped her name, as she has 13337 finds so far, so she&apos;s no small-time player.
	If they are willing to whitelist someone, they&apos;ll likely whitelist her.
	Furthermore, she&apos;s one of their paying members, and you don&apos;t want to block your customers.
</p>
<p>
	I finished the upcoming version of <a href="https://git.vola7ileiax4ueow.onion/y.st./include.d">include.d</a>, but it was a good thing that I started working on the debug scripts again.
	I had tried to use <code>\\rawurlencode()</code>.
	as a callback function for <code>\\preg_replace_callback()</code>.
	<code>\\preg_replace_callback()</code> passes an array to its callback, which I hadn&apos;t anticipated, and <code>\\rawurlencode()</code> operates on strings.
	It was an easy enough fix, I just needed a wrapper function, but it seemed like overkill to build a function that simply takes an array and passes the first element to <code>\\rawurlencode()</code>.
	I ended up instead creating a wrapper class that takes any callable during instantiation and wraps it for use with <code>\\preg_replace_callback()</code>.
	Any string manipulation function that takes a single string as an argument and returns a string as output can be wrapped with an instance of this class.
	I also had a flash of inspiration, so I built a function and constant autoloader proof of concept.
	It works perfectly, aside from the fact that you can&apos;t use the standard function-calling and constant-checking syntax if you want to make use of the autoloader.
	It would be much nicer if this functionality were built into $a[PHP] the way that the class autoloading functionality is.
	I didn&apos;t get a chance to finish documenting this autoloading class though, so I&apos;ll have to do that at a later time.
</p>
<p>
	There&apos;s still a lot of work to do before the debugging scripts are finished, but I think I&apos;m going to try to get back to the job hunt tomorrow.
	I&apos;ve made great progress on include.d over the past couple days, but include.d isn&apos;t my only responsibility, unfortunately.
</p>
<p>
	Today, we went out gathering bullet shells again.
	While out, our mother briefed us on a couple updates.
	First, it seems that the $a[CPR] training tomorrow isn&apos;t $a[CPR] training, it&apos;s first aid training.
	Apparently, she&apos;d told Cyrus and Vanessa, but had just assumed that I would somehow know.
	This changes things though.
	I&apos;m not sure that there&apos;s a general &quot;first aid certification&quot;, which means that there shouldn&apos;t be any need for my name anywhere; she won&apos;t be causing conflicts.
	Second, it seems that our mother was required to sign her work contract for next year today.
	Does that mean that we&apos;re staying in the city after all? I&apos;m not sure, she might end up getting out of the contract somehow.
</p>
END
);
